{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true,
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format='png'\n",
    "import pylab as pl\n",
    "import numpy as np\n",
    "import scipy.signal as signal\n",
    "import matplotlib as mpl\n",
    "mpl.rcParams['axes.grid'] = True\n",
    "import matplotlib.ticker as ptick "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## CWモードのためのフィルタ設計"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "CentSDR用に狭帯域モードを用意する"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "#### 方針と仕様\n",
    "\n",
    "300Hz帯域とするため、0Hzを中心とした正負対称で150HzカットオフのLPFを設計する。\n",
    "\n",
    "* サンプリングレート48000Hzにてfc=150Hzの6次IIRローパスフィルタ\n",
    "* 楕円(ellipitic)フィルタで、リプル1dB, 阻止量40dBとする\n",
    "* scipy.signalに用意されているフィルタ設計関数を用いて設計する"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEACAYAAAC3adEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGq9JREFUeJzt3X+MXXWZx/H305l2sFQ6LYapttIBym/FCUjR4C6jKHZJ\nBDSKdTE6KkRldXX9sdBF08aYFMzqalZJzPpjYAM2dTeRQgBpg9e4UVoULgX7gwEZKP0xrdCWUqG0\n02f/OOfyPVPu/Gjvved8b+/nlUx6v+ece+5zn9zOM9/vc8+95u6IiIhUTCo6ABERiYsKg4iIjKDC\nICIiI6gwiIjICCoMIiIyggqDiIiMUJfCYGY/NbMhM1ub2TbDzO4zs41m9mszm16PxxIRkcaq14zh\n58D7D9l2PbDK3U8H7gcW1emxRESkgaxeF7iZ2VzgTnc/Jx1vAC5y9yEzmwWU3P2MujyYiIg0TCN7\nDCe4+xCAu28DTmjgY4mISJ3k2XzWZ2+IiDSB9gaee8jMujJLSdurHWRmKhgiIkfA3a0R563njMHS\nn4oVQF96+5PAHaPd0d31487ixYsLjyGWH+VCuVAuxv5ppHq9XfV24PfAaWb2jJl9CrgReJ+ZbQQu\nTscyhsHBwaJDiIZyESgXgXKRj7osJbn7P46y6731OL+IiORHVz5HpK+vr+gQoqFcBMpFoFzko27X\nMRxxAGZedAwiIs3GzPAmaD5LjUqlUtEhREO5CJSLQLnIhwqDiIiMoKUkEZEmpKUkERHJjQpDRLR+\nGigXgXIRKBf5UGEQEZER1GMQEWlC6jGIiEhuVBgiovXTQLkIlItAuciHCoOIiIygHoOISBNSj0FE\nRHKjwhARrZ8GykWgXATKRT5UGEREZAT1GEREmpB6DCIikhsVhoho/TRQLgLlIlAu8qHCICIiI6jH\nICLShNRjEBGR3KgwRETrp4FyESgXgXKRj4YXBjNbYGYbzOxxM7uu0Y8nIiK1aWiPwcwmAY8DFwNb\ngAeBhe6+IXOMegwiIoepmXsM84EBd3/a3fcDy4DLG/yYIiJSg0YXhtnApsz42XSbVKH100C5CJSL\nQLnIR3vRAQCY9XH22d18+MPQ2dlJT08Pvb29QHghaNxa44pY4ilyXC6Xo4qnyHG5XI4qnjzHpVKJ\n/v5+ALq7u2mkRvcY3gEscfcF6fh6wN39pswxDkkMajWIiExMM/cYHgTmmdlcM5sCLARWNPgxRUSk\nBg0tDO4+DHwBuA/4M7DM3dc38jGb2aHLKK1MuQiUi0C5yEfDewzufi9w+ljHrFoFn/98oyMREZGJ\niOKzkv74R+eaa+ChhwoNRUSkaTRzj2FCJk1S41lEJBZRFAYzOHiw6CiKp/XTQLkIlItAuchHNIVB\nMwYRkThE0WN45BHnqqvg0UcLDUVEpGmoxyAiIrmJojCox5DQ+mmgXATKRaBc5COawqAZg4hIHKLo\nMaxb53zwg7Bhw/jHi4hIC/QYNGMQEYlHFIVBzeeE1k8D5SJQLgLlIh9RFAY1n0VE4hFFj2FgwHn/\n++HJJwsNRUSkabREj0FEROIQRWEA9RhA66dZykWgXATKRT6iKAyaMYiIxCOKHsOTTzoXXwxPPVVo\nKCIiTUM9BhERyU0UhQHUYwCtn2YpF4FyESgX+YiiMGjGICISjyh6DE895Vx0ETz9dKGhiIg0DfUY\nREQkN1EUBlCPAbR+mqVcBMpFoFzko6bCYGYfNrPHzGzYzM49ZN8iMxsws/VmdsnY56klChERqaea\negxmdjpwEPgx8DV3fyjdfiZwO3A+MAdYBZzqVR7MzPzpp50LL4RNm444FBGRlhJtj8HdN7r7AHBo\ncJcDy9z9gLsPAgPA/NHOoxmDiEg8GtVjmA1k//7fnG4blXoMWj/NUi4C5SJQLvLRPt4BZrYS6Mpu\nAhy4wd3vrEcQX/lKHy+80M2SJdDZ2UlPTw+9vb1AeCFo3FrjiljiKXJcLpejiqfIcblcjiqePMel\nUon+/n4Auru7aaS6XMdgZr8BvprpMVwPuLvflI7vBRa7++oq9/VNm5wLLoDNm2sORUSkJUTbYzhE\nNsAVwEIzm2JmJwHzgDWj3lE9BhGRaNT6dtUrzGwT8A7gLjO7B8Dd1wHLgXXA3cC11d6RlKUeg9ZP\ns5SLQLkIlIt8jNtjGIu7/wr41Sj7lgJLJ3IezRhEROIRxWclbd7snHcebN1aaCgiIk2jWXoMR0wz\nBhGReERRGEA9BtD6aZZyESgXgXKRjygKg2YMIiLxiKLHsHWr87a3wdBQoaGIiDQN9RhERCQ3URQG\nUI8BtH6apVwEykWgXOQjisKgGYOISDyi6DEMDTlnnw07dhQaiohI01CPQUREchNFYQD1GEDrp1nK\nRaBcBMpFPqIoDJoxiIjEI4oew44dzumnw3PPFRqKiEjTUI9BRERyE0VhAPUYQOunWcpFoFwEykU+\noigMmjGIiMQjih7Dc885p5wCO3cWGoqISNNQj0FERHITRWEA9RhA66dZykWgXATKRT6iKAyaMYiI\nxCOKHsPOnc7cubB7d6GhiIg0DfUYREQkN1EUBlCPAbR+mqVcBMpFoFzko6bCYGbfMbP1ZlY2s/81\ns+My+xaZ2UC6/5Kxz1NLFCIiUk819RjM7L3A/e5+0MxuBNzdF5nZWcBtwPnAHGAVcKpXeTAz8927\nndmzYc+eIw5FRKSlRNtjcPdV7n4wHT5AUgQALgOWufsBdx8EBoD5o51HMwYRkXjUs8fwaeDu9PZs\nYFNm3+Z026jUY9D6aZZyESgXgXKRj/bxDjCzlUBXdhPgwA3ufmd6zA3Afnf/xZEE8bnP9fHKK90s\nWQKdnZ309PTQ29sLhBeCxq01roglniLH5XI5qniKHJfL5ajiyXNcKpXo7+8HoLu7m0aq+ToGM+sD\nrgHe4+770m3Xk/QbbkrH9wKL3X11lfv7nj1OVxfs3VtTKCIiLSPaHoOZLQC+DlxWKQqpFcBCM5ti\nZicB84A1o5+nlihERKSeau0x/CcwDVhpZg+Z2c0A7r4OWA6sI+k7XFvtHUlZ6jFo/TRLuQiUi0C5\nyMe4PYaxuPupY+xbCiydyHk0YxARiUcUn5W0d69z/PHw0kuFhiIi0jSi7THUi2YMIiLxiKIwgHoM\noPXTLOUiUC4C5SIfURQGzRhEROIRRY/hpZec6dNh377xjxcREfUYREQkR1EUBlCPAbR+mqVcBMpF\noFzkI4rCoBmDiEg8ougx7NvnHHss7N9faCgiIk1DPQYREclNFIUB1GMArZ9mKReBchEoF/mIojBo\nxiAiEo8oegz79zsdHTA8XGgoIiJNQz0GERHJTRSFAdRjAK2fZikXgXIRKBf5iKIwaMYgIhKPKHoM\nw8NOW5tmDSIiE6Ueg4iI5CaKwiAJrZ8GykWgXATKRT6iKAyaMYiIxCOKHoO7YwYHD6pIiIhMxFHf\nYxARkXhEVRha/V1JWj8NlItAuQiUi3zUVBjM7Ftm9oiZlc1slZnNyexbZGYDZrbezC4Z/1y1RCIi\nIvVSU4/BzKa5+4vp7S8C57j7NWZ2FnAbcD4wB1gFnOpVHqzSY5g0Kfk+hra2Iw5HRKRlRNtjqBSF\n1LHAc+nty4Bl7n7A3QeBAWD+WOfSjEFEJA419xjM7Ntm9gzQByxNN88GNmUO25xuG5N6DKWiQ4iG\nchEoF4FykY/28Q4ws5VAV3YT4MAN7n6nu38D+IaZXQd8H/jU4QbR19eHezff+hbMnNlJT08Pvb29\nQHghaNxa44pY4ilyXC6Xo4qnyHG5XI4qnjzHpVKJ/v5+ALq7u2mkul3HYGZvBu5297ea2fWAu/tN\n6b57gcXuvrrK/dzdaW+Hl16CyZPrEo6IyFEt2h6Dmc3LDK8AyuntFcBCM5tiZicB84A1Y5+rlkhE\nRKReau0x3Ghma83sYaAX+CqAu68DlgPrgLuBa6u9I+lQ6jGUig4hGspFoFwEykU+xu0xjMXdPzzG\nvqWEZvS4NGMQEYlDNJ+VNGUK7NkDHR2FhiMi0hSi7THUk2YMIiJxiKYwgHoMWj8NlItAuQiUi3xE\nUxg0YxARiUM0PYZjjoGdO+F1rys0HBGRpqAeg4iI5CaawgDqMWj9NFAuAuUiUC7yEU1h0IxBRCQO\n0fQYpk6FHTvg2GMLDUdEpCmoxyAiIrmJpjCAegxaPw2Ui0C5CJSLfERTGDRjEBGJQzQ9hmnTYOtW\neP3rCw1HRKQpqMcgIiK5iaYwgHoMWj8NlItAuQiUi3xEUxg0YxARiUM0PYbjjoNNm2D69ELDERFp\nCuoxiIhIbqIpDKAeg9ZPA+UiUC4C5SIf0RQGzRhEROIQTY+hsxOeegpmzCg0HBGRpqAeg4iI5Caa\nwgDqMWj9NFAuAuUiUC7yUZfCYGZfNbODZjYzs22RmQ2Y2Xozu2T8c9QjEhERqVXNPQYzmwP8BDgd\nOM/dnzezM4HbgfOBOcAq4FSv8mCVHsPMmTAwAMcfX1M4IiItIfYew38AXz9k2+XAMnc/4O6DwAAw\nf6yTaMYgIhKH9lrubGaXAZvc/VEb+Zt9NvCHzHhzum1Uzz8Pd90FV14Jr3tdLVHlyx2Gh+HAgdH/\nHW3f8DAcPJicwx3+9KcSPT29r46z+0a7PdHjsrezscd6e+PGEqed1jvmMY167EY6ksd54okS8+b1\n5vJYRyqvx3riiRKnnNKby2Plmb+rr45rtWTcwmBmK4Gu7CbAgW8A/wa8r9Yg+vr6gG76+mDlyk6u\nvrqH3t5eIDSb6jW+554Szz8P3d29bNsGDzxQYu9eOOGEXl54ATZsSMZTp/by8suwfXuJV16ByZN7\n2bcPdu9OxgcPJvuHh0tMmgTt7b20t4N7ibY2OOaYZHzgQDKeNq2XtjbYty85vrOzl0mT4MUXS5jB\n9Om97NkDZsl4xoxezJLHM4OZM5Pxrl3J+Pjjk/HOncn4DW9Izvfcc8nz7epK9u/YkTxeZbx9e3J8\nV1eSj+3bRx6/bVsyfuMbk/3btiXHz5qVjIeGkv2zZiXHb92ajN/0pmT/1q3J8dn7V85nBlu2JOPZ\ns5P9W7Ykx2fvX/Hyy7B5czKeMyfZv3lzcnzl/tXGlePN4Nlnk/Gb35zsf/bZ5PjK+bL7zWDTppHH\nN2JsdnjHb99eZurUI3u8Q59/I5+fGTzzTDI+8cRkf73Hjz9eZvfuxp3/0HHl+TX68YaHk/FYv79K\npRL9/f0AdHd300hH3GMws7eQ9A7+RlIs5pDMDOYDnwZw9xvTY+8FFrv76irncXd/dSnp+9+HL33p\niEJ6lTs8+SSsXg2PPZb0Lh5/PLlOYngYZs1Kfrq6kip93HGv/Tn22GTmcswx0NGR/Fvtdnu7lsFE\nJH+N7DEc8VKSuz8GzKqMzewp4Fx332lmK4DbzOx7JEtI84A1Eznv0NCRxbN3L9x5J9xxB6xcCVOn\nwgUXwDnnwEc+AqeeCqeckvzS1y9yEZHR1fM6BieZOeDu64DlwDrgbuDaau9IqmbbtsN70B074Gtf\ng7lz4ZZb4N3vhnIZnnkGfvlL+OY34aMfhXPPTT65NeaioPdoB8pFoFwEykU+amo+Z7n7yYeMlwJL\nD/c8f/3rRB8PfvpTWLQo+cX/4INw0kmH+2giInKoaD4rqfKX/EUXwXh/FBw4AJ/9LKxZA8uWwdln\nNzxMEZGoRNljaJTdu8fe7w6f+Qxs2QIPPJA0iUVEpH6i+qwkgBdeGHv/D3+YvNPojjuOvqKg9dNA\nuQiUi0C5yEdTzRgGB2HJkuRtqFOn5hWRiEhria7HMHky7NtX/d1DV12VvO10yZJcQxQRiU4jewzR\nFYaODti587Ufi/H003DeecmsYdq03MMUEYlK7B+iV1fHHVe9z/DjH8PHP350FwWtnwbKRaBcBMpF\nPqIqDG1t1QuDO9x2W/JuJBERaayolpLa2+Gss+DWW+FtbwvHPPIIfOhD8MQTcV+5LCKSl5ZaSpo6\nFf72t5Hb7roLPvABFQURkTxEVRjMqheG3/0O0k+hPapp/TRQLgLlIlAu8hFVYYDXFoaDB5PrFt75\nzuJiEhFpJVH1GKZMgSuugA9+EBYuTPZv2ACXXgp/+UuhYYqIRKVlegzVlpLWroWenuJiEhFpNVEV\nBnhtYdi4Ec44o7h48qT100C5CJSLQLnIR/SFYcMGOP304uIREWk1UfUYjjkGrrsu2V75PKS3vx1+\n9KPkazpFRCTR0j2GgYHkg/NERCQfUReGPXuSb2ubMaPYuPKi9dNAuQiUi0C5yEdUhQFGFoYtW+BN\nb9IVzyIieYq+MMyeXWw8eepthcu7J0i5CJSLQLnIR1SFwSz5HoZDZwwiIpKfqAoDJF/Us29fcrvV\nCoPWTwPlIlAuAuUiHzUVBjNbbGbPmtlD6c+CzL5FZjZgZuvN7JKJnS/5WIxXXknGW7bAG99YS4Qi\nInK42utwju+5+/eyG8zsTOBK4ExgDrDKzE71cS6aMBs5Y3j++ZHfy3C00/ppoFwEykWgXOSjHktJ\n1d4zdDmwzN0PuPsgMADMn8jJOjrCjGHXLujsrEOEIiIyYfUoDF8ws7KZ/cTMpqfbZgObMsdsTreN\nqbKUVJkx7NzZOtcwgNZPs5SLQLkIlIt8jLuUZGYrga7sJsCBG4CbgW+5u5vZt4HvAlcfbhB9fX1A\nNy+/DL/4RSe7dvUAvezaBQMDJdzDFLLywtD46B5XxBJPkeNyuRxVPEWOy+VyVPHkOS6VSvT39wPQ\n3d1NI9Xts5LMbC5wp7ufY2bXA+7uN6X77gUWu/vqKvd79bOSpk+Hhx+Gd78bBgfhxBOTb2+bO7cu\nIYqIHDWi/awkM5uVGX4IeCy9vQJYaGZTzOwkYB6wZvzzjWw+t9pSkohIDGrtMXzHzNaaWRm4CPgX\nAHdfBywH1gF3A9eO946kiinp21UPHICXXoJp02qMsIkcuozSypSLQLkIlIt81PR2VXf/xBj7lgJL\nD+d82RnDrl3J0tKk6C7BExE5ukX1fQwzZsC2bcksYePG0GsQEZGRou0xNMLkybB/P+zdm3ygnoiI\n5CuqwmAWrmXYvTv5QL1WovXTQLkIlItAuchHdIUBksKwa1frFQYRkRhE1WN4wxtgx47k3x/8AG65\nBe67r9DwRESi1FI9BtCMQUSkSFEWho4O9RhanXIRKBeBcpGPqApDpcfQ0ZFc9dxqhUFEJAZR9RhO\nOAGGhuAtb4F3vQva2uBHPyo0PBGRKLVMj6EyY2hvhz17NGMQESlCVIWhoq2tNQuD1k8D5SJQLgLl\nIh9RFobKjEFXPouI5C+qHsOsWbB1K1x4YfJBeh//OHz5y4WGJyISpZbpMVS0tyefldTRUXQkIiKt\nJ6rCUGk+t7XByy8nH6jXSrR+GigXgXIRKBf5iLIwtLe3ZmEQEYlBVD2Gk0+GJ5+ESy+F3/8+uYbh\nqqsKDU9EJEot0WPo6ICzz05ut7cnX+upGYOISP6iKQxDQ7B8eXK7rS353udWKwxaPw2Ui0C5CJSL\nfNT0nc/1NH16uN2eRtVqhUFEJAbR9BiyPvYxWLYM7rkHFiwoKDARkYi1RI8hSzMGEZHi1FwYzOyL\nZrbezB41sxsz2xeZ2UC675LDOWdbW/JvqxUGrZ8GykWgXATKRT5qKgxm1gt8AHiru78V+Pd0+5nA\nlcCZwD8AN5vZhKc8rTpjKJfLRYcQDeUiUC4C5SIftc4YPg/c6O4HANz9r+n2y4Fl7n7A3QeBAWD+\nRE9aKQzt0bTG87Fr166iQ4iGchEoF4FykY9aC8NpwN+b2QNm9hszOy/dPhvYlDluc7ptQlp1xiAi\nEoNx/yY3s5VAV3YT4MA30vvPcPd3mNn5wC+Bk2sOqkULw+DgYNEhREO5CJSLQLnIR01vVzWzu4Gb\n3P236XgAeAdwDYC735huvxdY7O6rq5yj2PfLiog0qUa9XbXWVfxfAe8BfmtmpwFT3P05M1sB3GZm\n3yNZQpoHrKl2gkY9MREROTK1FoafAz8zs0eBfcAnANx9nZktB9YB+4FrX3MVm4iIRKnwK59FRCQu\nhV75bGYLzGyDmT1uZtcVGUujmNmgmT1iZg+b2Zp02wwzu8/MNprZr81seub4qhcGmtm5ZrY2zdX3\ni3guh8vMfmpmQ2a2NrOtbs/dzKaY2bL0Pn8wsxPze3aHZ5RcLDazZ83sofRnQWbf0ZyLOWZ2v5n9\nOb0w9p/T7S332qiSiy+m24t9bbh7IT8kRekJYC4wGSgDZxQVTwOf519I3rmV3XYT8K/p7etIrgUB\nOAt4mGSJrzvNT2VWtxo4P719N/D+op/bBJ77u4AeYG0jnjvJdTQ3p7c/SnLtTOHP+zBysRj4SpVj\nzzzKczEL6ElvTwM2Ame04mtjjFwU+toocsYwHxhw96fdfT+wjOTCuKON8dqZ2eXALentW4Ar0tuX\nUeXCQDObBbze3R9Mj7s1c59oufv/ATsP2VzP55491/8AF9f9SdTJKLmA5PVxqKoXiB5Fudjm7uX0\n9ovAemAOLfjaGCUXlWu+CnttFFkYDr0I7lkO4yK4JuLASjN70MyuTrd1ufsQJC8M4IR0+2gXBs4m\nyU9FM+fqhDo+91fv4+7DwC4zm9m40BviC2ZWNrOfZJZOWiYXZtZNMpN6gPr+v2i6fGRyUXlbf2Gv\njSg/XfUoc6G7nwtcCvyTmf0dSbHIauV3ANTzuTfbW59vBk529x5gG/DdOp47+lyY2TSSv2C/lP61\n3Mj/F1Hno0ouCn1tFFkYNgPZJsicdNtRxd23pv/uILnuYz4wZGZdAOkUcHt6+GbgzZm7V3Iy2vZm\nVM/n/uo+M2sDjnP35xsXen25+w5PF36B/yJ8nthRnwszayf5Rfjf7n5HurklXxvVclH0a6PIwvAg\nMM/M5prZFGAhsKLAeOrOzKamfwlgZscClwCPkjzPvvSwTwKV/xgrgIXpuwhOIr0wMJ1W7zaz+WZm\nJNeL3EFzMEb+hVLP574iPQfAR4D7G/Ys6mNELtJffhUfAh5Lb7dCLn4GrHP3H2S2tepr4zW5KPy1\nUXBHfgFJF34AuL7IWBr0/E4iebfVwyQF4fp0+0xgVfrc7wM6M/dZRPJOg/XAJZnt56XnGAB+UPRz\nm+Dzvx3YQnLx4zPAp4AZ9XruQAewPN3+ANBd9HM+zFzcCqxNXyO/Illjb4VcXAgMZ/5vPJT+Lqjb\n/4tmyccYuSj0taEL3EREZAQ1n0VEZAQVBhERGUGFQURERlBhEBGREVQYRERkBBUGEREZQYVBRERG\nUGEQEZER/h+LbXwoN5OoIwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x113bd0990>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "bb, aa = signal.ellip(6, 1, 40, 150.0/24000, 'low')\n",
    "w,h = signal.freqz(bb, aa, worN=4096)\n",
    "w = w * 48000 / (2 *np.pi)\n",
    "pl.ylim((-60, 10))\n",
    "pl.plot(w, 20 * np.log10(abs(h)));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\njOLEoQ7uAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11399cdd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.xlim(0, 1000)\n",
    "pl.ylim((-65, 5))\n",
    "pl.plot(w, 20 * np.log10(abs(h)));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 0.00099325, -0.00595041,  0.0148624 , -0.01981048,  0.0148624 ,\n",
       "        -0.00595041,  0.00099325]),\n",
       " array([  1.        ,  -5.98127859,  14.9072007 , -19.81600654,\n",
       "         14.81760149,  -5.90959322,   0.98207615]))"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nRGr8f38cBg5PbaMHAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1133e3390>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "bb, aa = signal.ellip(6, 1, 60, 150.0/24000, 'low')\n",
    "w,h = signal.freqz(bb, aa, worN=4096)\n",
    "w = w * 48000 / (2 *np.pi)\n",
    "pl.ylim((-80, 10))\n",
    "pl.plot(w, 20 * np.log10(abs(h)));\n",
    "bb,aa"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x113525910>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.xlim(0, 1000)\n",
    "pl.ylim((-80, 5))\n",
    "pl.plot(w, 20 * np.log10(abs(h)));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 双二次(biquad)に分解\n",
    "\n",
    "特性を確認できたら、つづいて実装のための係数を求める。\n",
    "\n",
    "実装では2次フィルタを直列にカスケードする。そのため6次フィルタを3つの2次フィルタに分解することを考える。具体的にはba形式(多項式の係数)で表現された伝達関数(6次式)を、3つの2次式の積に因数分解することになる。しかし、多項式に展開済みの伝達関数の分解は容易ではないので、分解が容易になるようzpk形式という零点と極の位置とゲインで表現した形式で再設計してみる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 0.99636455+0.085192j  ,  0.99941981+0.03405942j,\n",
       "         0.99963570+0.02699014j,  0.99636455-0.085192j  ,\n",
       "         0.99941981-0.03405942j,  0.99963570-0.02699014j]),\n",
       " array([ 0.99466326-0.00641379j,  0.99697235-0.01572576j,\n",
       "         0.99900368-0.01956282j,  0.99466326+0.00641379j,\n",
       "         0.99697235+0.01572576j,  0.99900368+0.01956282j]),\n",
       " 0.0009932518091724748)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z, p, k = signal.ellip(6, 1, 60, 150.0/24000, 'low', output='zpk')\n",
    "z,p,k"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "ちなみにzpk2tf関数を使うと、zpk形式を伝達関数の係数形式に変換できる。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 0.00099325, -0.00595041,  0.0148624 , -0.01981048,  0.0148624 ,\n",
       "        -0.00595041,  0.00099325]),\n",
       " array([  1.        ,  -5.98127859,  14.9072007 , -19.81600654,\n",
       "         14.81760149,  -5.90959322,   0.98207615]))"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "signal.zpk2tf(z, p, k)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 順序を決定\n",
    "\n",
    "2次フィルタを構成するために、共役な零点zのペアと極pのペアをそれぞれ選択する。共役なzとpは3個毎に並んでいるようなので、それらをペアにして、それぞれ個別に組み合わせて伝達関数を計算する。それらを重ねてプロットし、検討する。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nDnFhQIIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x113a03310>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_biquad(n, m, kk=k):\n",
    "    bb, aa = signal.zpk2tf(z[n::3], p[m::3], kk)\n",
    "    w,h = signal.freqz(bb, aa, worN=4096)\n",
    "    w = w * 48000 / (2 *np.pi)\n",
    "    pl.ylim((-100, 20))\n",
    "    pl.xlim((0, 1000))\n",
    "    pl.plot(w, 20 * np.log10(abs(h)));\n",
    "    return bb, aa\n",
    "b0,a0 = plot_biquad(0, 0, k**0.68)\n",
    "b1,a1 = plot_biquad(1, 1, k**0.22)\n",
    "b2,a2 = plot_biquad(2, 2, k**0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "オーバーフローが発生しないよう、ゲインを適切に配分し、フィルタの順序を決定する。この例では青、緑、赤の順に適用する。ピークが生じる部分でオーバーフローさせないよう、先に減衰させるような順序としている。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "得られた3つの伝達関数の係数を確認してみる"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.00907821 -0.01809042  0.00907821] [ 1.         -1.98932652  0.98939613]\n",
      "[ 0.21845051 -0.43664753  0.21845051] [ 1.         -1.99394471  0.99420117]\n",
      "[ 0.50084799 -1.00133107  0.50084799] [ 1.         -1.99800737  0.99839106]\n"
     ]
    }
   ],
   "source": [
    "print b0, a0\n",
    "print b1, a1\n",
    "print b2, a2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### CMSIS-DSPLIB用に係数を変換\n",
    "\n",
    "IIRフィルタの実装は、CMSIS_DSPLIBで提供されているarm_biquad_cascade_df1_q15関数を用いる。その仕様に合わせて各係数を16ビット固定小数点の整数値に変換する。1を越えている係数があるので、16ビットに納まるよう1ビット右シフトした数値とするため32768>>1=16384を乗じ、数値を整数に丸める。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 149. -296.  149.] [ 16384. -32593.  16210.]\n",
      "[ 3579. -7154.  3579.] [ 16384. -32669.  16289.]\n",
      "[  8206. -16406.   8206.] [ 16384. -32735.  16358.]\n"
     ]
    }
   ],
   "source": [
    "print np.rint(b0*16384),np.rint(a0*16384)\n",
    "print np.rint(b1*16384),np.rint(a1*16384)\n",
    "print np.rint(b2*16384),np.rint(a2*16384)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### コード用に整形\n",
    "\n",
    "arm_biquad_cascade_df1_q15関数に使用する係数は、並べ方に注意する必要があるのと、定義の違いによりaの符号が反対であることに注意する必要がある。詳しくはリファレンス(1)を参照のこと。\n",
    "\n",
    "(1)http://www.keil.com/pack/doc/CMSIS/DSP/html/group___biquad_cascade_d_f1.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "q15_t bq_coeffs[] = {\n",
      "\t149, 0, -296, 149, 32593, -16210, \n",
      "\t3579, 0, -7154, 3579, 32669, -16289, \n",
      "\t8206, 0, -16406, 8206, 32735, -16358, \n",
      "};\n"
     ]
    }
   ],
   "source": [
    "def bq(b, a):\n",
    "    b, a = np.rint(b*16384), np.rint(a*16384)\n",
    "    print \"\\t\" + \"\".join([\"%d, \"%v for v in [b[0], 0, b[1], b[2], -a[1], -a[2]]])\n",
    "print \"q15_t bq_coeffs[] = {\"\n",
    "bq(b0, a0)\n",
    "bq(b1, a1)\n",
    "bq(b2, a2)\n",
    "print \"};\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "### 完成"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  },
  "toc": {
   "toc_cell": false,
   "toc_number_sections": true,
   "toc_threshold": 6,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
